package proj;
import java.util.Scanner;
//import edu.neuq.Luncher;

public class proj {
	public static void main(String[] args) throws Exception {//入口点main
		// TODO 自动生成的方法存根
//	Scanner reader;
 //虚拟机如何知道咱们的代码需要加载哪个类，类的加载是动态的
	System.out.println(People.class);//People第一次出现，这时必须需要People class的字节码,内存静态存储区
	People p=new People();//程序依赖于People，创建People创建People类的代码，必须在这行代码之前
	//p指向实体People对象;People的字节码作为模板创造一个对象
	System.out.println(p);
	
	System.out.println("-------------------------");
	
	//基于反射的六行代码，可以在bobfr类创建之前运行
	//使用反射，代码可以不依赖于任何具体的类创建
	//①获取类的名字②生成一个实例
	Scanner reader=new Scanner(System.in);
	String className=reader.nextLine();
	Class c=Class.forName(className);//手动指明一个类，要求虚拟机读取字节码
	System.out.println(c);
	Object o=c.newInstance();//创建类的对象
	System.out.println(o);
	
 //类的加载过程：虚拟机去什么地方找类字节码？如何用eclipse打jar包

	
//	edu.neuq.Luncher l=new edu.neuq.Luncher();//一种方法是写上类的全名

	//	p.age=0;
	//	p.name="zhang3";
	/*	p.setName("zhang3");
		System.out.println(p.getName());
		p.access1();
		People p2=new People();//People第二次出现，这个时候 不 需要People。因为People字节码已经放入了静态存储区 //类似C++动态链接库
	    People.PEOPLE_NUM=100;//静态存储区的变量，可以用类名直接访问
	    System.out.print(People.class);*/

//	Luncher l=new Luncher();
//	Luncher l2=new Luncher();//另一种方法就是使用import语句，来引入这个类
	
		//类和方法Class and method : blueprint prototype
		//declaring定义 creating创建实例化 variables变量 
	//	Scanner reader=new Scanner(System.in);
		
		People wang5;//创建wang5是一个引用变量，wang5的类型是people
	//	wang5=new People("wang5");//让变量指向内存里的一个实体：通过new,给对象wang5分配了一点空间，在堆里，虚拟机会堆这个对象进行初始化,name=null,age=0
		
		//建立一个栈
	//	People zhang3=new People("zhang3");//调用方法,属性跟随定义：变量zhang3是一个引用，这个引用在栈里，zhang3指向的对象，存在堆里
	//	People li4=new People("li4");
		
		//现在内存的堆里，存在三个对象，都是独立的
		//wang5,zhang3,li4的作用就是分别指向内存里的对象
		//类都是引用类型，没有指针这个概念，变量指向数组也是引用
	/*	
		System.out.println(wang5.name);
		System.out.println(zhang3.name);
		
		System.out.println(wang5);
		System.out.println(zhang3);
		
		wang5=zhang3;//赋值：让这两个变量，都指向了堆里的“zhang3”，堆里的"wang5"就成为了垃圾
		 //“=”使得不同的引用 指向同一个内存空间,类叫做引用类型，创建对象存在堆里，变量指向堆里的内存
		
		System.out.println(wang5.name);
		System.out.println(zhang3.name);
		
		System.out.println(wang5);
		System.out.println(zhang3);
		
		
		System.out.println(li4);
		
		
	//	zhang3.sayHello();
	//	zhang3.sayHello("world");
		//类静态描述字节码，对象在内存的堆里，对象是虚拟机创建出来的	
		//类只有一个，创造许多对象
		
	
		//建立一个栈
		
		
		People.PEOPLE_NUM=1;//调用类变量，不需要创建任何对象
		People.access2();//在没有创建任何实例的情况下。可以调用类方法——此时不存在实例相关内容
		
		
		People zhang3;
	//	zhang3.name="zhang3";先创建实例才能调用,先有对象，才有实例变量
		
		//这里有两个对象，zhang3和Li4，都是在堆里，两个对象就有两个name，也有两个age
		//name和age是跟随实例一起放到堆里，所以它们叫做实例变量
		zhang3=new People();//变量zhang3放在栈里，对象放在堆里
		zhang3.name="zhang3";//实例变量
		zhang3.access1();//只有创建了实例之后，才可以调用实例方法
		
		People li4=new People();//变量li4放在栈里，对象放堆里
		
		System.out.println(People.PEOPLE_NUM);
		
		li4.name="li4";//用实例名字调用实例变量
		
	//	int a=100;//变量a在栈里，有4字节
	//	int []array={100,200};//array在栈里，array是个引用类型，指向放在堆里的数组，数组有两个元素，元素放在堆里
		
	//	zhang3.pass(a);//脱离main方法，进入到pass方法
		//方法执行结束，回到main方法的栈里，a依旧是100
	//	System.out.println("a="+a);
		
	//	zhang3.pass(array);
	//	System.out.println("array[0]="+array[0]);//打印数组的值，是从堆里取值
		//引用类型：方法中+1操作，被保留下来
		//整个程序结束：main方法的栈没了，堆也没了，数组也没了，people对象也没了，vm虚拟机进程也没了
		
		*/	
		
	}
}
